\documentclass[a4paper]{article}
\usepackage{xeCJK}
\setCJKmainfont{WenQuanYi Micro Hei}
\usepackage[affil-it]{authblk}
\usepackage[backend=bibtex,style=numeric]{biblatex}
\usepackage{geometry}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{listings}
\geometry{margin=1.5cm, vmargin={0pt,1cm}}
\setlength{\topmargin}{-1cm}
\setlength{\paperheight}{29.7cm}
\setlength{\textheight}{25.3cm}

\addbibresource{citation.bib}

\begin{document}
% =================================================
\title{Numerical Analysis homework \# 2}

\author{王劼 Wang Jie 3220100105
  \thanks{Electronic address: \texttt{2645443470@qq.com}}}
\affil{(math), Zhejiang University }


\date{Due time: \today}

\maketitle

\begin{abstract}
   Programming homework chapter2   
\end{abstract}

% ============================================
\section*{programing homework}
完成第二章编程作业A、B、C、D、E、F。

\cite{wangheyu2024}

\subsection*{Question A}  
\textbf{Answer:}\\  
本次代码包含了第一章的Fuction.hpp，其中\texttt{Function} 类是一个抽象基类，用于表示数学函数。它定义了函数的基本接口，包括函数值的计算和导数值的估计。这个类旨在为各种具体的数学函数提供一个通用的框架，使得这些函数可以在不同的数学和工程应用中被统一处理。

\textbf{功能}

\begin{itemize}
    \item \textbf{纯虚函数} \texttt{operator()(double x) const}：这个函数允许对象作为函数被调用，返回在点 \texttt{x} 处的函数值。具体函数的实现必须由派生类提供。
    \item \textbf{虚函数} \texttt{derivative(double x) const}：这个函数提供了一个默认的实现，用于估计函数在点 \texttt{x} 处的导数值。它使用中心差分法，这是一种数值微分的方法，通过计算函数在 \texttt{x + h} 和 \texttt{x - h} 处的值，然后利用这些值来估计导数。
\end{itemize} 

Interpolation.hpp中有一组用于数值插值的C++类的设计。这些类提供了不同类型的插值方法，包括牛顿插值、埃尔米特插值和贝塞尔插值。这些类设计为易于扩展和维护，以支持更复杂的数值分析任务。

\textbf{类设计}

\subsubsection*{Interpolation 类}
\texttt{Interpolation} 类是一个抽象基类，定义了插值算法的通用接口。它包含一个引用成员 \texttt{f}，指向一个 \texttt{Function} 对象，该对象定义了要进行插值的函数。

\begin{lstlisting}
class Interpolation {
protected:
    const Function& f;
public:
    Interpolation(const Function& f) : f(f) {}
    virtual double interpolate(double x) const = 0;
    virtual ~Interpolation() = default;
};
\end{lstlisting}

\subsubsection*{NewtonInterpolation 类}
\texttt{NewtonInterpolation} 类继承自 \texttt{Interpolation} 类，实现了牛顿插值算法。它使用给定的一组点来构建插值多项式，并能够对任意点进行插值。

\begin{lstlisting}
class NewtonInterpolation : public Interpolation {
private:
    std::vector<double> x;
    std::vector<double> y;
    std::vector<double> dividedDifferences;
public:
    NewtonInterpolation(const Function& f, const std::vector<double>& x);
    double interpolate(double x_val) const;
};
\end{lstlisting}

\subsubsection*{HermiteInterpolation 类}
\texttt{HermiteInterpolation} 类继承自 \texttt{Interpolation} 类，实现了埃尔米特插值算法。它使用给定的一组点和导数值来构建插值多项式，并能够对任意点进行插值。

\begin{lstlisting}
class HermiteInterpolation : public Interpolation {
private:
    std::vector<std::vector<double>> matrix;
    std::vector<double> x;
    size_t cols;
    size_t rows;
    size_t r;
    std::vector<double> dividedDifferences;
public:
    HermiteInterpolation(const std::vector<std::vector<double>>& matrix);
    double interpolate(double x_val) const;
};
\end{lstlisting}

\subsubsection*{BezierInterpolation 类}
\texttt{BezierInterpolation} 类继承自 \texttt{Interpolation} 类，实现了贝塞尔插值算法。它使用一组控制点来构建贝塞尔曲线，并能够对任意点进行插值。

\begin{lstlisting}
class BezierInterpolation : public Interpolation {
private:
    std::vector<std::vector<double>> matrix;
public:
    BezierInterpolation(const std::vector<std::vector<double>>& matrix);
    std::vector<double> interpolate_vector(double x_val);
};
\end{lstlisting}

\subsection*{Question B}  
\textbf{Answer:} 

Output:  \\
这是对于函数$f(x) = \frac{1}{1 + x^2}$，在$x \in [-5, 5]$，使用节点$x_i = -5 + 10 \frac{i}{n}, \quad i = 0, 1, \ldots, n$作牛顿插值，其中 $n = 2, 4, 6, 8$所绘制的多项式与精确函数的对比图，以重现笔记中说明龙格现象的图表。
\begin{figure}[htbp] 
    \centering 
    \includegraphics[width=0.5\textwidth]{B.png} 
    \caption{B} 
    \label{figB} 
\end{figure}

\subsection*{Question C}
\textbf{Answer:} 

Output: \\
对于函数
\[
f(x) = \frac{1}{1 + 25x^2}
\]
在区间 $x \in [-1, 1]$ 上，使用切比雪夫多项式 $T_n$ 的零点，其中 $n = 5, 10, 15, 20$。使用牛顿插值绘制插值多项式与精确函数的对比图，以观察切比雪夫插值避免了前一个题目中的大幅振荡。

\begin{figure}[htbp] 
    \centering 
    \includegraphics[width=0.5\textwidth]{C.png} 
    \caption{C} 
    \label{figC} 
\end{figure}

\subsection*{Question D}
\textbf{Answer:} 

Output: \\
\begin{enumerate}
    \item[(a)] 使用埃尔米特多项式预测汽车在 $t=10$ 秒时，位置为742.503英尺，速度为48.3817英尺每秒。
    \item[(b)] 由v-t图像知，速度超过81英尺每秒，故而超速了。
    \begin{figure}[htbp] 
        \centering 
        \includegraphics[width=0.5\textwidth]{D.png} 
        \caption{D} 
        \label{figD} 
    \end{figure}
\end{enumerate}

\subsection*{Question E}
\textbf{Answer:} 

Output: \\
\begin{enumerate}
    \item[(a)] 使用牛顿插值多项式预测画出如图两样本sp1和sp2平均体重曲线。
    \begin{figure}[htbp] 
        \centering 
        \includegraphics[width=0.5\textwidth]{E.png} 
        \caption{E} 
        \label{figE} 
    \end{figure}
    \item[(b)] 由两样本牛顿插值多项式曲线以及计算（$Predicted weight for Sp1 after 15 days: 14640.3,Predicted weight for Sp2 after 15 days: 2981.48$）可预测15天后两样本不会灭亡。
\end{enumerate}
但是根据实际情况而言，该曲线在一些地方并不符合现实情况比如sp1曲线在一开始时降为了负数，之后有变为了正数。

\subsection*{Question F}
\textbf{Answer:} 

Output: \\
以下方程的根构成了一个封闭的平面曲线，形状像一个心形：
\[
x^{2}+\left(\frac{3}{2} y-\sqrt{|x|}\right)^{2}=3.\qquad(2.61)
\]

分别选择 $m=10, 40, 160$用三次贝塞尔曲线逼近这个心形，并绘制了逼近图形，即分段三次多项式并生成三个心形函数的图形。如下图所示。
\begin{figure}[htbp] 
    \centering 
    \includegraphics[width=0.5\textwidth]{F.png} 
    \caption{F} 
    \label{figF} 
\end{figure}



% ===============================================
\section*{ \center{\normalsize {Acknowledgement}} }
None.


\printbibliography

\end{document}